#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
//void* my_memcpy(void* dest, const void* src, size_t size)
//{
//	assert(dest && src);
//	void* ret = dest;
//	if (dest < src)
//	{
//		while (size--)
//		{
//			*(char*)dest = *(char*)src;
//			dest = (char*)dest + 1;
//			src = (char*)src + 1;
//		}
//	}
//	else
//	{
//		while (size--)
//		{
//			*((char*)dest + size) = *((char*)src + size);
//		}
//	}
//	return ret;
//}
//
//void reverse_arr(void* arr, size_t num, size_t size)
//{
//	assert(arr);
//	char tmp[1024] = { 0 };
//	int i = 0;
//	for (i = 0; i < num / 2; i++)
//	{
//		char* e1 = (char*)arr + i * size;
//		char* e2 = (char*)arr + (num - 1 - i) * size;
//		my_memcpy(tmp, e1, size);
//		my_memcpy(e1, e2, size);
//		my_memcpy(e2, tmp, size);
//	}
//}
//
//void print_arr(const int* arr, size_t sz)
//{
//	assert(arr);
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", *(arr + i));
//	}
//	printf("\n");
//}
//
//void scanf_arr(int* arr, size_t sz)
//{
//	assert(arr);
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		scanf("%d", arr + i);
//	}
//}
//
//void test()
//{
//	int arr[10] = { 0 };
//	size_t sz = sizeof(arr) / sizeof(arr[0]);
//	scanf_arr(arr, sz);
//	printf("reverse before:\n");
//	print_arr(arr, sz);
//	reverse_arr(arr, sz, sizeof(arr[0]));
//	printf("reverse after:\n");
//	print_arr(arr, sz);
//}
//
//int main()
//{
//	test();
//	return 0;
//}

//int int_cmp(const void* buf1,const void* buf2)
//{
//	assert(buf1 && buf2);
//	return (*(int*)buf1 - *(int*)buf2);
//}
//
//void exchange_element(void* e1, void* e2, size_t size)
//{
//	assert(e1 && e2);
//	char tmp = 0;
//	while (size--)
//	{
//		tmp = *(char*)e1;
//		*(char*)e1 = *(char*)e2;
//		*(char*)e2 = tmp;
//		e1 = (char*)e1 + 1;
//		e2 = (char*)e2 + 1;
//	}
//}
//
//void bubble_sort(void* arr, size_t num, size_t size, int(*fun)(void*, void*))
//{
//	assert(arr && fun);
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < num - 1; i++)
//	{
//		for (j = 0; j < num - 1 - i; j++)
//		{
//			if (fun(((char*)arr + j * size), ((char*)arr + (j + 1) * size)) > 0)
//			{
//				exchange_element(((char*)arr + j * size), ((char*)arr + (j + 1) * size), size);
//			}
//		}
//	}
//}
//
//void print_arr(int* arr, size_t sz)
//{
//	assert(arr);
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", *(arr + i));
//	}
//	printf("\n");
//}
//
//void scanf_arr(int* arr, size_t sz)
//{
//	assert(arr);
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		scanf("%d", arr + i);
//	}
//}
//
//void test()
//{
//	int arr[10] = { 0 };
//	size_t sz = sizeof(arr) / sizeof(arr[0]);
//	scanf_arr(arr, sz);
//	printf("sort before:\n");
//	print_arr(arr, sz);
//	bubble_sort(arr, sz, sizeof(arr[0]),int_cmp);
//	printf("sort after\n");
//	print_arr(arr, sz);
//}
//
//int main()
//{
//	test();
//	return 0;
//}

//strlen
//int my_strlen(const char* arr)
//{
//	assert(arr);
//	int count = 0;
//	while (*arr)
//	{
//		arr++;
//		count++;
//	}
//	return count;
//}
//
//void test()
//{
//	char arr[10] = "abcdefg";
//	int r = my_strlen(arr);
//	printf("%d \n", r);
//}
//
//int main()
//{
//	test();
//	return 0;
//}

//strcmp
//int my_strcmp(const char* arr1, const char* arr2)
//{
//	assert(arr1 && arr2);
//	while (*arr1 == *arr2)
//	{
//		if (!*arr1)
//		{
//			return 0;
//		}
//		arr1++;
//		arr2++;
//	}
//	return *arr1 - *arr2;
//}
//
//void test()
//{
//	char arr1[10] = "abcdefg";
//	char arr2[10] = "abcdefq";
//	int r = my_strcmp(arr1, arr2);
//	printf("%d\n", r);
//}
//
//int main()
//{
//	test();
//	return 0;
//}

//strcpy
//char* my_strcpy(char* dest, const char* src)
//{
//	assert(dest && src);
//	char* ret = dest;
//	while (*dest++ = *src++)
//	{
//		;
//	}
//	return ret;
//}
//
//void test()
//{
//	char arr1[10] = "abcdefg";
//	char arr2[10] = { 0 };
//	printf("%s", my_strcpy(arr2, arr1));
//}
//
//int main()
//{
//	test();
//	return 0;
//}

//strcat
//char* my_strcat(char* dest, const char* src)
//{
//	assert(dest && src);
//	char* ret = dest;
//	while (*dest)
//	{
//		dest++;
//	}
//	while (*dest++ = *src++)
//	{
//		;
//	}
//	return ret;
//}
//
//void test()
//{
//	char arr1[10] = "abcd";
//	char arr2[] = "cpdd";
//	printf("%s", my_strcat(arr1, arr2));
//}
//
//int main()
//{
//	test();
//	return 0;
//}

//strstr
//char* my_strstr(const char* arr1, const char* arr2)
//{
//	assert(arr1 && arr2);
//	if (!*arr2)
//	{
//		return arr1;
//	}
//	char* buf1 = NULL;
//	char* buf2 = NULL;
//	while (*arr1)
//	{
//		buf1 = arr1;
//		buf2 = arr2;
//		while (*buf1 != '\0' && *buf2 != '\0' && *buf1 == *buf2)
//		{
//			buf1++;
//			buf2++;
//		}
//		if (*buf2 == '\0')
//		{
//			return arr1;
//		}
//		arr1++;
//	}
//	return NULL;
//}
//
//void test()
//{
//	char arr1[10] = "abccpdd";
//	char arr2[] = "cpdd";
//	printf("%s", my_strstr(arr1, arr2));
//}
//
//int main()
//{
//	test();
//	return 0;
//}

//memcpy
void* my_memcpy(void* dest, const void* src, size_t size)
{
	assert(dest && src);
	void* ret = dest;
	if (dest < src)
	{
		while (size--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else
	{
		while (size--)
		{
			*((char*)dest + size) = *((char*)src + size);
		}
	}
}

void test()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,0 };
	int arr2[10] = { 0 };
	my_memcpy(arr2, arr1, sizeof(arr1));
	size_t sz = sizeof(arr1) / sizeof(arr1[0]);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr2[i]);
	}
	printf("\n");
}

int main()
{
	test();
	return 0;
}